package com.hua.designpattern.behavioral.observer;

/**
 * 
 * @author joshua
 *
 *         <pre>
 *
 *  观察者模式,　有时被称作发布/订阅模式,定义了一种一对多的依赖关系，让多个观察者对象同时监听某一个主题对象。
 *      这个主题对象在状态发生变化时，会通知所有观察者对象，使它们能够自动更新自己。
 *      
 *	优点：  1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
 *	缺点：  如果一个被观察者对象有很多的直接和间接的观察者的话，将所有的观察者都通知到会花费很多时间。 
 *
 *	    
 *	在实现观察者模式中，应尽量避免观察者和观察目标之间有循环依赖，否则观察目标会触发它们之间进行循环调用，可能导致系统崩溃。
 *	如果顺序执行，某一观察者错误会导致系统卡壳，一般采用异步方式。
 *
 *
 *	观察者模式(Observer) 与 订阅者模式(发布/订阅模式  Subscriber)
 *		1. 都是主动类发生变化，被动类收到通知的设计模式，解决一种一对多的依赖关系。
 *		2. 实现方式大致一样，都是主动类调用被动类接口发送信息。
 *		3. 应用场景有差别：
 *				观察者模式：观察者会一直主动监听目标的动静。
 *				订阅者模式： 订阅者可以订阅多个发布者或者取消已有的发布者。
 *
 *		REF:
 *			JDK提供接口 java.util.Observer, 可以辅助实现观察者模式
 *			RSS/RDF订阅    消息订阅
 *
 *         </pre>
 *
 */
public class TestObserver {

	@SuppressWarnings("unused")
	public static void main(String[] args) {
		ObserverSubject subject = new ObserverSubject();
		ObserverInterface observerConcrete1 = new ObserverConcrete1(subject);
		ObserverInterface observerConcrete2 = new ObserverConcrete2();
		subject.addObserver(observerConcrete2);
		ObserverInterface observerConcrete3 = new ObserverConcrete3(subject);

		subject.setMessage("first notity message!!");
		System.out.println("--------------");
		subject.setMessage("second notity message!!");
		System.out.println("--------------");
		subject.notityAllObserver();
		System.out.println("--------------");

		subject.removeObserver(observerConcrete2);
		subject.notityAllObserver();
	}

}
